package com.ssyt.yt1.day19.generic;

import java.util.ArrayList;
import java.util.List;

/**
 * <pre>
 * 泛型传递范围的限制：在引用传递时，在泛型类的操作中，在进行引用传递的时候泛型类型必须匹配才可以传递，否则是无法传递的。
 * 		   a）无限定通配符：<?>
 * 		        通过<?>修饰的只能接收，不能做修改
 * 		   b）上限通配符：<? extends 类名>
 * 		        <? extends Number>表示只能接收Number或者Number的子类。
 * 		   c）下限通配符：<? super 类名>
 * 		        <? super String>表示只能接收String或者String的父类Object
 * 		   d）<T extends Info>
 * 		  注：通配符可以用于方法上、类上、接口上等。
 * 
 * </pre>
 * 
 * @author Administrator
 *
 */
public class GenericDemo4 {

	/**
	 * 泛型传递时类型必须与其一致！
	 * 
	 * @param list
	 */
	public static void test1(List<Number> list) {
		System.out.println(list);
	}

	public static void test2(Number number) {
		System.out.println(number);
	}

	/**
	 * 可以接收任意类型的泛型，但是不能对其修改数据
	 * 
	 * @param list
	 */
	public static void test3(List<?> list) {
		// list.add(true);
		System.out.println(list);
	}

	/**
	 * 要想接收任意类型的泛型，要想修改数据，就必须得擦除
	 * 
	 * @param list
	 */
	public static void test4(List list) {
		// 泛型擦除
		// list.add(true);
		System.out.println(list);
	}

	/**
	 * 上限通配符：<? extends 类名><br/>
	 * <? extends Number>表示只能接收Number或者Number的子类。<br/>
	 * 
	 * 注：上限通配符不能修改数据，要想修改数据，就必须得擦除
	 * 
	 * @param list
	 */
	public static void test5(List<? extends Number> list) {
		// list.add(1);
		System.out.println(list);
	}

	/**
	 * 下限通配符：<? super 类名><br/>
	 * <? super Integer>表示只能接收Integer、Integer的父类Number、Number的父类Object<br/>
	 * 
	 * 注：下限通配符修改数据
	 * 
	 * @param list
	 */
	public static void test6(List<? super Integer> list) {
		list.add(1);
		System.out.println(list);
	}

	public static void main(String[] args) {
		List<Integer> numberList = new ArrayList<>();
		numberList.add(123);

		// test1(numberList);
		// test2(1);
		// test3(numberList);
		// test4(numberList);
		// test5(numberList);
		test6(numberList);
	}

}
